package lock;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @author jiangwz
 * @create 2019/9/14.
 */
public class SemaphoreDemo {

    /**
     * 原理:
     * 把state设置为2, 线程来了锁住 state 减一, 如果2个线程被用完了 state=0,其他线程来 state - 1 = -1 < 0 ,就放到队列中去,
     * 等线程把锁释放后 state+1 == 0+1 = 1, 一旦有线程看到有线程释放锁了 state=1 ,赶紧抢过来, 让 state = 0 依次进行.直至完成
     * @param args
     */
    public static void main(String[] args){

        // 信号量(限流) 只允许2个线程同时执行
        Semaphore semaphore = new Semaphore(2);

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName());
                    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }


            }, ""+i).start();
        }

    }
}
